Use Case層
Clean architectureの用語
Onion architectureでいうところのApplication Service
DDDに関わるアーキテクチャ#5c637eac3f44250000135235
オニオンアーキテクチャにておいて、ドメイン層とアプリケーション層の責務はどう違うのか - little hands' lab
Domain層のメソッドをつかってユースケースを作成する層
独立したコアレイヤパターンでは
https://github.com/shin1x1/phpconsen2019/blob/master/packages/Acme/Point/Core/UseCases/AddPoint/AddPointUseCase.php
独立したコアレイヤーパターンのUse CaseはDDDでいうApplication Serviceにみえるkadoyau.icon
kadoyau.iconがよくわかっていないこと
Domain ServiceとUse Caseの切り分け
domain services hold domain logic whereas application services don’t.
Domain services vs Application services - Enterprise Craftsmanship
↑はコード付きのわかりやすい記事なので読んだメモ
ドメイン知識はドメインが持つ
Domain ServiceとDomain Entityがあるが、Entityのisolationが失われるロジックはEntityにもたせられない
例:外部サービスで何かを判定してその結果を使うドメイン固有の処理がある場合
注:Domain Service上ではもちろん外部サービスをそのままつかってはいけない。インタフェースをきるkadoyau.icon
これはドメインサービスを使う
Use Caseはドメインのメソッドを呼び出して使っていくだけで、ドメイン知識をもってはいけない
「ドメイン知識」が何を指すのかが曖昧
「ドメイン知識を手順通りに呼ぶ」こともドメイン知識と言えそう。そういう意味ではUse Caseはドメインを表現している
例えば、ドメインの不変条件の判定をしてはいけない
こういう意味でのドメインは意味していない
図:DDDに関わるアーキテクチャ#5c629eb33f44250000b9dc93
Domain Serviceにわたすために、値をバリデーションはすることがある
だけど、Domain Serviceは(理想的には)不適な値が入ったら例外を投げたりするようにつくられているので、万が一バリデーションが漏れても不整合は起きない
ユースケース固有のロジックは持ってもいいはず
名前は機能(ストーリー)を表すとかになる?
例
一般ユーザはXできるとY
APIのControllerではバリデーションを行い、後の責務はUse Caseに移譲する
GraphQLならUse Caseを使って要素を解決するResolver現れる?
バッチでXの情報をYに送る
この場合バッチでは引数のバリデーションを行い、後の責務はUse Caseに移譲する
https://speakerdeck.com/tanakahisateru/puroguramatute-donnaren-niu-ru-toluan-deli-jie-surupuroguramatoiuren-zhong?slide=41